package com.wonder.media;

import android.view.SurfaceHolder;
import android.view.SurfaceView;

public abstract class Player {
	///overlay screen format
	public static final int OVERLAY_FORMAT_RGB = 0;
	public static final int OVERLAY_FORMAT_YUV420 = 1;
	public static final int OVERLAY_FORMAT_YUV420SP = 2;
	public static final int OVERLAY_FORMAT_YUV422_UYVY = 3;
	public static final int OVERLAY_FORMAT_YUV422_YUYV = 4;
	public static final int OVERLAY_FORMAT_YUV422_YVYU = 5;
	public static final int OVERLAY_FORMAT_YUV422_VYUY = 6;

	// player status

	public final static int	EPlayerStatus_NULL = 0;						/*还未播放过*/
	public final static int	EPlayerStatus_Inited = 1;
	public final static int	EPlayerStatus_ConnectingServer = 2;			/* 正在连接服务器：					建议UI给用户提示播放器正在连接Server */
	public final static int	EPlayerStatus_MediaOpenError = 3;			/* 没有找到与URL相对应的内容或者没连上服务器 */
	public final static int	EPlayerStatus_NotSupported = 4;					/*文件格式不支持*/
	public final static int	EPlayerStatus_OpenOK = 5;
	public final static int	EPlayerStatus_Pause = 6;
	public final static int	EPlayerStatus_SeekOK = 7;
	public final static int	EPlayerStatus_Stop = 8;
	public final static int	EPlayerStatus_Buffering = 9;			   		/* 正在缓冲*/
	public final static int	EPlayerStatus_Playing = 10;
	public final static int	EPlayerStatus_ConnectBroken = 11;			/*与服务器断开链接，超过2s没收到数据*/
	public final static int	EPlayerStatus_EndOfStream = 12;				/* 播放至文件结尾 */
	public final static int	EPlayerStatus_Abnormal = 13;		
	public final static int	EPlayerStatus_Unsmooth  = 14;
	public final static int	EPlayerStatus_DISCONNECT  = 15;

	//// player public APIs

	/**
	 * {@literal description：初始化播放器}
	 * 
	 * @param view
	 *            native player需要显示用到的SurfaceView
	 * @param SocketName
	 *            ophone联网时需要绑定的端口
	 *            //采用HTTP streaming时的代理（如："10.0.0.200:80"，或NULL）
	 * @param httpUserAgent
	 *            采用HTTP streaming时的UserAgent（如"IE","Opera",
	 *            "MH-AD20-MotorolaXT800_1.0.0.29" ，或NULL）
	 * @param nFirmwareVersion
	 *            手机固件版本号。暂时专用于MOTOxt800，6 对应ver2.0.1，7 对应ver2.1
	 * @return true表示正确；false表示错误
	 * @see UI启动后，需要调用该函数（只需一次），然后才能调用其它接口函数，该函数与close()相对应。
	 *      如果调用该函数时,SurfaceView中的Surface没有被创建，需要在surfaceCreated后调用updateSuraface，
	 *      总之必须保证在播放器start前surface已经create出来。
	 *      如果不确定是否采用HTTP代理时，暂时可以输入NULL.
	 */
	public abstract boolean init(SurfaceView view, String SocketName, String httpUserAgent, int nFirmwareVersion, 
			int nRenderType, int nVideoFormat, int nColorTab, int nAndroidVer);

	/**
	 * {@literal description: 打开文件或者URL开始播放节目，调用play后播放}
	 * 
	 * @param dataSource
	 *            文件名（包括路径）或者URL链接
	 * @param startTime
	 *            开始播放的起点（单位为“秒”）
	 * @return 
	 * @see 只有在调用该函数后，其它的控制函数才能正常运行
	 */
	public abstract void start(String dataSource, int pos);

	/**
	 * {@literal description: 播放器掉转到sec处播放}
	 * 
	 * @param sec
	 *            开始播放的起始点，单位秒
	 * @return 
	 * @see 如果需要拖动播放，直接运行该函数，播放器会自动从指定位置开始播放，无需顾及播放器是否处在暂停状态、播放结束状态、缓冲状态
	 */
	public abstract void seekTo(int sec);

	/**
	 * {@literal description: 恢复播放。在暂停后，运行该函数，可以从暂停处开始，继续播放}
	 * 
	 * @return 
	 * @see 在暂停播放后，用于恢复播放，和pause()对应，在调用start也需要调用该函数才能播放
	 */
	public abstract void play();
	
	/**
	 * {@literal description: 暂停播放}
	 * 
	 * @return 
	 * @see 在缓冲状态下，依然可以暂停
	 */
	public abstract void pause();
	
	/**
	 * {@literal description: 停止播放}
	 * 
	 * @return 
	 * @see 当出现返回时间过长的情况， UI检测到播放器播放结束时，建议调用该函数
	 */
	public abstract void stop();
	
	/**
	 * {@literal description: 退出播放器（播放器被销毁）}
	 * 
	 * @see UI退出时，调用该函数，该函数与init()相对应
	 */
	public abstract void close();
	
	/**
	 * {@literal description: }
	 * 
	 * @see 播放器暂停并释放硬件资源(OverLay写屏方式) 切入后台时调用。
	 */
	public abstract void suspend();
    
	/**
	 * {@literal description: }
	 * 
	 * @see 播放器重新获取硬件资源(OverLay写屏方式) 切回前台时调用。
	 */
    public abstract void resume();
    
    public abstract void destroy();
    
    public abstract int getwidth();
    
    public abstract int getheight();

	/**
	 * {@literal description: 更新用于video显示的surface}
	 * @param x 
	 * @param y 
	 * @param width 
	 * @param height 
	 * 
	 * @see 当suraface发生变化时，需要通知播放器。
	 */
	public abstract void updateSurface(SurfaceHolder holder, int x, int y, int widthPixels, int heightPixels);

	/**
	 * {@literal description: 获取已经播放的时间}
	 * 
	 * @return 已经播放的时间（单位：秒）
	 */
	public abstract int getPassedSec();

	/**
	 * {@literal description: 获取节目的总时长，单位“秒”}
	 * 
	 * @return 节目的总时长； -1表示错误
	 * @see 节目总时长不会改变，所以调用成功以后，无需再次调用【返回值>0，表示调用成功】。
	 *      返回值如果为0x7FFFFFFF，表示进行流媒体播放时，
	 *      Server没有给出播放的结束时间，比如直播，此种情况建议UI不显示节目总时长，也不要画播放进度条，同时禁用拖动播放的功能
	 */
	public abstract int getDuration();

	/**
	 * {@literal description: 当正在缓冲时，获取缓冲的百分比}
	 * 
	 * @return 缓冲百分比
	 * @see 只有在网络播放时该函数才有效，本地文件播放无缓冲
	 */
	public abstract int getBufferPercentage(); 

	/**
	 * {@literal description: 获取播放器的当前状态}
	 * 
	 * @return 播放器所处的状态
	 */
	public abstract int getPlayerStatus();

	/**
	 * {@literal description: 向播放器注册listener}
	 * 
	 * @return 
	 * 
	 * @see UI实现PlayerStatusListener然后注册到Player，当Player的状态发生变化时会通知UI
	 */
	public abstract void addPlayerEventListener(PlayerEventListener listener);
	
	
	/**
	 * {@literal description: 向播放器注销listener}
	 * 
	 * @return 
	 * 
	 * @see UI当不需要知晓player event或者退出时，将PlayerEventListener注销掉。
	 */
	public abstract void removePlayerEventListener(PlayerEventListener listener);

	
	public abstract void setVideoMode(int mode);
	
}
